home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_41 / mfspec06.txt
Text File  |  1995-01-01  |  28KB  |  639 lines

  1. [This document is Dave Oppenheim's current version of the MIDI file 
  2. specification, as sent to those who have participated in its 
  3. development.  The consensus seems to be to submit this to the MIDI 
  4. Manufacturers' Association as version 1.0.  I apologize for any loss of 
  5. clarity that might have occurred in the conversion from a Microsoft Word 
  6. document to this pure text file.  I have removed some of the discussion 
  7. about recent changes to the specification in order to keep the file size 
  8. reasonable.--Doug Wyatt]
  9.  
  10. Standard MIDI Files 0.06    March 1, 1988
  11.  
  12.  
  13. 0  Introduction
  14.  
  15. This describes a proposed standard MIDI file format.  MIDI files contain 
  16. one or more MIDI streams, with time information for each event.  Song, 
  17. sequence, and track structures, tempo and time signature information, 
  18. are all supported.  Track names and other descriptive information may be 
  19. stored with the MIDI data.  This format supports multiple tracks and 
  20. multiple sequences so that if the user of a program which supports 
  21. multiple tracks intends to move a file to another one, this format can 
  22. allow that to happen.
  23.  
  24. This spec defines the 8-bit binary data stream used in the file.  The 
  25. data can be stored in a binary file, nibbleized, 7-bit-ized for 
  26. efficient MIDI transmission, converted to Hex ASCII, or translated 
  27. symbolically to a printable text file.  This spec addresses what's in 
  28. the 8-bit stream.
  29.  
  30.  
  31.  
  32. We'd like to make MIDI Files 1.0 happen as soon as possible, so please 
  33. respond soon with any comments or proposals you have about MIDI File 
  34. transmission, the MIDI meta-event event or any other comments or 
  35. questions you have about anything in this specification. 
  36.  
  37.  
  38. Please direct comments to:
  39.  
  40. Dave Oppenheim
  41. Opcode Systems
  42. 1024 Hamilton Court
  43. Menlo Park, California 94025
  44. (415) 321-8977
  45.  
  46. 1  Sequences, Tracks, Chunks:  File Block Structure
  47.  
  48. Sequence files are made up of chunks.  Each chunk has a 4-character type 
  49. and a 32-bit length, which is the number of bytes in the chunk.  On the 
  50. Macintosh, data is passed either in the data fork of a file, or on the 
  51. Clipboard.  (The file type on the Macintosh for a file in this format 
  52. will be "Midi".)  On any other computer, the data is simply the contents 
  53. of the file.  This structure allows future chunk types to be designed 
  54. which may easily be ignored if encountered by a program written before 
  55. the chunk type is introduced.   Your programs should expect alien chunks 
  56. and treat them as if they weren't there.
  57.  
  58. This proposal defines two types of chunks:  a header chunk and a track 
  59. chunk.  A header chunk provides a minimal amount of information 
  60. pertaining to the entire MIDI file.  A track chunk contains a sequential 
  61. stream of MIDI data which may contain information for up to 16 MIDI 
  62. channels.  The concepts of multiple tracks, multiple MIDI outputs, 
  63. patterns, sequences, and songs may all be implemented using several 
  64. track chunks.
  65.  
  66. A MIDI file always starts with a header chunk, and is followed by one or 
  67. more track chunks.
  68.  
  69. MThd  <length of header data>
  70. <header data>
  71. MTrk  <length of track data>
  72. <track data>
  73. MTrk  <length of track data>
  74. <track data>
  75.  ...
  76.  
  77. Track Data Format (MTrk chunk type)
  78.  
  79. The MTrk chunk type is where actual song data is stored.  It is simply a 
  80. stream of MIDI events (and non-MIDI events), preceded by delta-time 
  81. values.
  82.  
  83. Some numbers in MTrk chunks are represented in a form called a variable-
  84. length quantity. These numbers are represented 7 bits per byte, most 
  85. significant bits first.  All bytes except the last have bit 7 set, and 
  86. the last byte has bit 7 clear.  If the number is between 0 and 127,  it 
  87. is thus represented exactly as one byte.  
  88.  
  89. Here are some examples of numbers represented as variable-length 
  90. quantities:
  91.  
  92.     Number (hex)    Representation (hex)
  93.     00000000    00
  94.     00000040    40
  95.     0000007F    7F
  96.     00000080    81 00
  97.     00002000    C0 00
  98.     00003FFF    FF 7F
  99.     00004000    81 80 00
  100.     00100000    C0 80 00
  101.     001FFFFF    FF FF 7F
  102.     00200000    81 80 80 00
  103.     08000000    C0 80 80 00
  104.     0FFFFFFF    FF FF FF 7F
  105.     
  106.  
  107. The largest number which is allowed is 0FFFFFFF so that the variable-
  108. length representation must fit in 32 bits in a routine to write 
  109. variable-length numbers.  Theoretically, larger numbers are possible, 
  110. but 2 x 108 96ths of a beat at a fast tempo of 500 beats per minute is 
  111. four days, long enough for any delta-time!
  112.  
  113. Here is the syntax of an MTrk chunk:
  114.  
  115. <track data> = <MTrk event>+
  116.  
  117. <MTrk event> = <delta-time> <event>
  118.  
  119. <delta-time> is stored as a variable-length quantity.  It represents the 
  120. amount of time before the following event.  If the first event in a 
  121. track occurs at the very beginning of a track, or if two events occur 
  122. simultaneously, a delta-time of zero is used.  Delta-times are always 
  123. present.  (Not storing delta-times of 0 requires at least two bytes for 
  124. any other value, and most delta-times aren't zero.)  Delta-time is in 
  125. some fraction of a beat (or a second, for recording a track with SMPTE 
  126. times), as specified in the header chunk.  
  127.  
  128. <event> = <MIDI event> | <sysex event> | <meta-event>
  129.  
  130. <MIDI event> is any MIDI channel message.  Running status is used: 
  131. status bytes may be omitted after the first byte.  The first event in a 
  132. file must specify status.  Delta-time is not  considered an event 
  133. itself:  it is an integral part of the specification.  Notice that 
  134. running status occurs across delta-times.  
  135.  
  136. <meta-event> specifies non-MIDI information useful to this format or to 
  137. sequencers, with this syntax:
  138.  
  139.     FF <type> <length> <bytes>
  140.  
  141. All meta-events begin with FF, then have an event type byte (which is 
  142. always less than 128), and then have the length of the data stored as a 
  143. variable-length quantity, and then the data itself.  If there is no 
  144. data, the length is 0.  As with sysex events, running status is not 
  145. allowed.  As with chunks, future meta-events may be designed which may 
  146. not be known to existing programs, so programs must properly ignore 
  147. meta-events which they do not recognize, and indeed, should expect to 
  148. see them.  New for 0.06:  programs must never ignore the length of a 
  149. meta-event which they do recognize, and they shouldn't be surprised if 
  150. it's bigger than they expected.  If so, they must ignore everything past 
  151. what they know about.  However, they must not add anything of their own 
  152. to the end of a meta-event.
  153.  
  154. <sysex event> is used to specify a MIDI system exclusive message, or as 
  155. an "escape" to specify any arbitrary bytes to be transmitted.  
  156. Unfortunately, some synthesizer manufacturers specify that their system 
  157. exclusive messages are to be transmitted as little packets.  Each packet 
  158. is only part of an entire syntactical system exclusive message, but the 
  159. times they are transmitted at are important.  Examples of this are the 
  160. bytes sent in a CZ patch dump, or the FB-01's "system exclusive mode" in 
  161. which microtonal data can be transmitted.  To be able to handle 
  162. situations like these, two forms of  <sysex event> are provided:
  163.  
  164.     F0 <length> <bytes to be transmitted after F0>
  165.     F7 <length> <all bytes to be transmitted>
  166.  
  167. In both cases, <length> is stored as a variable-length quantity.  It is 
  168. equal to the number of bytes following it, not including itself or the 
  169. message type (F0 or F7), but all the bytes which follow, including any 
  170. F7 at the end which is intended to be transmitted.  The first form, with 
  171. the F0 code, is used for syntactically complete system exclusive 
  172. messages, or the first packet an a series ╤ that is, messages in which 
  173. the F0 should be transmitted.  The second form is used for the remainder 
  174. of the packets within a syntactic sysex message, which do not begin with 
  175. F0.  Of course, the F7 is not considered part of the system exclusive 
  176. message.  Of course, just as in MIDI, running status is not allowed, in 
  177. this case because the length is stored as a variable-length quantity 
  178. which may or may not start with bit 7 set.
  179.  
  180. (New to 0.06)  A syntactic system exclusive message must always end with 
  181. an F7, even if the real-life device didn't send one, so that you know 
  182. when you've reached the end of an entire sysex message without looking 
  183. ahead to the next event in the MIDI file.  This principle is repeated 
  184. and illustrated in the paragraphs below.
  185.  
  186. The vast majority of system exclusive messages will just use the F0 
  187. format.  For instance, the transmitted message F0 43 12 00 07 F7 would 
  188. be stored in a MIDI file as F0 05 43 12 00 07 F7.  As mentioned above, 
  189. it is required to include the F7 at the end so that the reader of the 
  190. MIDI file knows that it has read the entire message.
  191.  
  192. For special situations when a single system exclusive message is split 
  193. up, with parts of it being transmitted at different times, such as in a 
  194. Casio CZ patch transfer, or the FB-01's "system exclusive mode", the F7 
  195. form of sysex event is used for each packet except the first.  None of 
  196. the packets would end with an F7 except the last one, which must end 
  197. with an F7.  There also must not be any transmittable MIDI events in-
  198. between the packets of a multi-packet system exclusive message.  Here is 
  199. an example:  suppose the bytes F0 43 12 00 were to be sent, followed by 
  200. a 200-tick delay, followed by the bytes  43 12 00 43 12 00, followed by 
  201. a 100-tick delay, followed by the bytes  43 12 00 F7, this would be in 
  202. the MIDI File:
  203.  
  204.     F0 03 43 12 00
  205.     81 48                    200-tick delta-time
  206.     F7 06 43 12 00 43 12 00
  207.     64                    100-tick delta-time
  208.     F7 04 43 12 00 F7
  209.  
  210. The F7 event may also be used as an "escape" to transmit any bytes 
  211. whatsoever, including real-time bytes, song pointer, or MIDI Time Code, 
  212. which are not permitted normally in this specification.  No effort 
  213. should be made to interpret the bytes used in this way.  Since a system 
  214. exclusive message is not being transmitted, it is not necessary or 
  215. appropriate to end the F7 event with an F7 in this case. 
  216.  
  217.  
  218. 2    Header Chunk
  219.  
  220. The header chunk at the beginning of the file specifies some basic 
  221. information about the data in the file.  The data section contains three 
  222. 16-bit words, stored high byte first (of course).  Here's the syntax of 
  223. the complete chunk:
  224.  
  225.     <chunk type> <length> <format> <ntrks> <division> 
  226.  
  227. As described above, <chunk type> is the four ASCII characters 'MThd'; 
  228. <length> is a 32-bit representation of the number 6 (high byte first).  
  229. The first word, format, specifies the overall organization of the file.  
  230. Only three values of format are specified:
  231.  
  232.     0    the file contains a single multi-channel track
  233.     1    the file contains one or more simultaneous tracks (or MIDI 
  234. outputs) of a sequence
  235.     2    the file contains one or more sequentially independent 
  236. single-track patterns
  237.  
  238. The next word, ntrks, is the number of track chunks in the file.  The 
  239. third word, division,  is the division of a quarter-note represented by 
  240. the delta-times in the file.  (If division is negative, it represents 
  241. the division of a second represented by the delta-times in the file, so 
  242. that the track can represent events occurring in actual time instead of 
  243. metrical time.  It is represented in the following way:  the upper byte 
  244. is one of the four values -24, -25, -29, or -30, corresponding to the 
  245. four standard SMPTE and MIDI time code formats, and represents the 
  246. number of frames per second.  The second byte (stored positive) is the 
  247. resolution within a frame:  typical values may be 4 (MIDI time code 
  248. resolution), 8, 10, 80 (bit resolution), or 100.  This system allows 
  249. exact specification of time-code-based tracks, but also allows 
  250. millisecond-based tracks by specifying 25 frames/sec and a resolution of 
  251. 40 units per frame.)    
  252.  
  253. Format 0, that is, one multi-channel track, is the most interchangeable 
  254. representation of data.  One application of MIDI files is a simple 
  255. single-track player in a program which needs to make synthesizers make 
  256. sounds, but which is primarily concerned with something else such as 
  257. mixers or sound effect boxes.  It is very desirable to be able to 
  258. produce such a format, even if your program is track-based, in order to 
  259. work with these simple programs.  On the other hand, perhaps someone 
  260. will write a format conversion from format 1 to format 0 which might be 
  261. so easy to use in some setting that it would save you the trouble of 
  262. putting it into your program.
  263.  
  264. Programs which support several simultaneous tracks should be able to 
  265. save and read data in format 1, a vertically one-dimensional form, that 
  266. is, as a collection of tracks.  Programs which support several 
  267. independent patterns should be able to save and read data in format 2, a 
  268. horizontally one-dimensional form.  Providing these minimum capabilities 
  269. will ensure maximum interchangeability.
  270.  
  271. MIDI files can express tempo and time signature, and they have been 
  272. chosen to do so for transferring tempo maps from one device to another.  
  273. For a format 0 file, the tempo will be scattered through the track and 
  274. the tempo map reader should ignore the intervening events; for a format 
  275. 1 file, the tempo map must (starting in 0.04) be stored as the first 
  276. track.  It is polite to a tempo map reader to offer your user the 
  277. ability to make a format 0 file with just the tempo, unless you can use 
  278. format 1.
  279.  
  280. All MIDI files should specify tempo and time signature.  If they don't, 
  281. the time signature is assumed to be 4/4, and the tempo 120 beats per 
  282. minute.  In format 0, these meta-events should occur at least at the 
  283. beginning of the single multi-channel track.  In format 1, these meta-
  284. events should be contained in the first track.  In format 2, each of the 
  285. temporally independent patterns should contain at least initial time 
  286. signature and tempo information.
  287.  
  288. We may decide to define other format IDs to support other structures.  A 
  289. program reading an unfamiliar format ID should return an error to the 
  290. user rather than trying to read further.
  291.  
  292. 3    Meta-Events
  293.  
  294. A few meta-events are defined herein.  It is not required for every 
  295. program to support every meta-event.  Meta-events initially defined 
  296. include:
  297.  
  298. FF 00 02 ssss    Sequence Number
  299. This optional event, which must occur at the beginning of a track, 
  300. before any nonzero delta-times, and before any transmittable MIDI 
  301. events, specifies the number of a sequence.  The number in this track 
  302. corresponds to the sequence number in the new Cue message discussed at 
  303. the summer 1987 MMA meeting.  In a format 2 MIDI file, it is used to 
  304. identify each "pattern" so that a "song" sequence using the Cue message 
  305. to refer to the patterns.  If the ID numbers are omitted, the sequences' 
  306. locations in order in the file are used as defaults.  In a format 0 or 1 
  307. MIDI file, which only contain one sequence, this number should be 
  308. contained in the first (or only) track.  If transfer of several 
  309. multitrack sequences is required, this must be done as a group of format 
  310. 1 files, each with a different sequence number.
  311.  
  312. FF 01 len text    Text Event
  313. Any amount of text describing anything.  It is a good idea to put a text 
  314. event right at the beginning of a track, with the name of the track, a 
  315. description of its intended orchestration, and any other information 
  316. which the user wants to put there.  Text events may also occur at other 
  317. times in a track, to be used as lyrics, or descriptions of cue points.  
  318. The text in this event should be printable ASCII characters for maximum 
  319. interchange.  However, other character codes using the high-order bit 
  320. may be used for interchange of files between different programs on the 
  321. same computer which supports an extended character set.  Programs on a 
  322. computer which does not support non-ASCII characters should ignore those 
  323. characters.
  324.  
  325. (New for 0.06 ).  Meta event types 01 through 0F are reserved for 
  326. various types of text events, each of which meets the specification of 
  327. text events(above) but is used for a different purpose: 
  328.  
  329. FF 02 len text    Copyright Notice
  330. Contains a copyright notice as printable ASCII text.  The notice should 
  331. contain the characters (C), the year of the copyright, and the owner of 
  332. the copyright.  If several pieces of music are in the same MIDI file, 
  333. all of the copyright notices should be placed together in this event so 
  334. that it will be at the beginning of the file.  This event should be the 
  335. first event in the first track chunk, at time 0.
  336.  
  337.  
  338. FF 03 len text    Sequence/Track Name
  339. If in a format 0 track, or the first track in a format 1 file, the name 
  340. of the sequence.  Otherwise, the name of the track.
  341.  
  342. FF 04 len text    Instrument Name
  343. A description of the type of instrumentation to be used in that track.  
  344. May be used with the MIDI Prefix meta-event to specify which MIDI 
  345. channel the description applies to, or the channel may be specified as 
  346. text in the event itself.
  347.  
  348. FF 05 len text    Lyric
  349. A lyric to be sung.  Generally, each syllable will be a separate lyric 
  350. event which begins at the event's time.
  351.  
  352. FF 06 len text    Marker
  353. Normally in a format 0 track, or the first track in a format 1 file.  
  354. The name of that point in the sequence, such as a rehearsal letter or 
  355. section name ("First Verse", etc.). 
  356.  
  357.  
  358. FF 07 len text    Cue Point
  359. A description of something happening on a film or video screen or stage 
  360. at that point in the musical score ("Car crashes into house", "curtain 
  361. opens", "she slaps his face", etc.)
  362.  
  363. FF 2F 00    End of Track
  364. This event is not optional.  It is included so that an exact ending 
  365. point may be specified for the track, so that it has an exact length, 
  366. which is necessary for tracks which are looped or concatenated.  
  367.  
  368. FF 51 03 tttttt        Set Tempo, in microseconds per MIDI quarter-note
  369. This event indicates a tempo change.  Another way of putting 
  370. "microseconds per quarter-note" is "24ths of a microsecond per MIDI 
  371. clock".  Representing tempos as time per beat instead of beat per time 
  372. allows absolutely exact long-term synchronization with a time-based sync 
  373. protocol such as SMPTE time code or MIDI time code.  This amount of 
  374. accuracy provided by this tempo resolution allows a four-minute piece at 
  375. 120 beats per minute to be accurate within 500 usec at the end of the 
  376. piece.  Ideally, these events should only occur where MIDI clocks would 
  377. be located ╤ this convention is intended to guarantee, or at least 
  378. increase the likelihood, of compatibility with other synchronization 
  379. devices so that a time signature/tempo map stored in this format may 
  380. easily be transferred to another device. 
  381.  
  382. FF 54 05 hr mn se fr ff    SMPTE Offset  (New in 0.06 - SMPTE Format 
  383. specification)
  384. This event, if present, designates the SMPTE time at which the track 
  385. chunk is supposed to start.  It should be present at the beginning of 
  386. the track, that is, before any nonzero delta-times, and before any 
  387. transmittable MIDI events.  The hour must be encoded with the SMPTE 
  388. format, just as it is in MIDI Time Code.  In a format 1 file, the SMPTE 
  389. Offset must be stored with the tempo map, and has no meaning in any of 
  390. the other tracks.  The ff field contains fractional frames, in 100ths of 
  391. a frame, even in SMPTE-based tracks which specify a different frame 
  392. subdivision for delta-times.
  393.  
  394. FF 58 04 nn dd cc bb    Time Signature 
  395. The time signature is expressed as four numbers.  nn and dd represent 
  396. the numerator and denominator of the time signature as it would be 
  397. notated.  The denominator is a negative power of two:  2 represents a 
  398. quarter-note, 3 represents an eighth-note, etc.  The cc parameter 
  399. expresses the number of MIDI clocks in a metronome click.  The bb 
  400. parameter expresses the number of notated 32nd-notes in a MIDI quarter-
  401. note (24 MIDI Clocks).  This was added because there are already 
  402. multiple programs which allow the user to specify that what MIDI thinks 
  403. of as a quarter-note (24 clocks) is to be notated as, or related to in 
  404. terms of, something else. 
  405.  
  406. Therefore, the complete event for 6/8 time, where the metronome clicks 
  407. every three eighth-notes, but there are 24 clocks per quarter-note, 72 
  408. to the bar, would be (in hex):
  409.  
  410.     FF 58 04 06 03 24 08
  411.  
  412. That is, 6/8 time (8 is 2 to the 3rd power, so this is 06 03), 32 MIDI 
  413. clocks per dotted-quarter (24 hex!), and eight notated 32nd-notes per 
  414. MIDI quarter note.
  415.  
  416. FF 59 02 sf mi    Key Signature
  417.         sf = -7:  7 flats
  418.         sf = -1:  1 flat
  419.         sf = 0:  key of C
  420.         sf = 1:  1 sharp
  421.         sf = 7: 7 sharps
  422.         
  423.         mi = 0:  major key
  424.         mi = 1:  minor key
  425.         
  426. FF 7F len data    Sequencer-Specific Meta-Event
  427.  
  428.         Special requirements for particular sequencers may use this 
  429. event type:  the first byte or bytes of data is a manufacturer ID.  
  430. However, as this is an interchange format, growth of the spec proper is 
  431. preferred to use of this event type.  This type of event may be used by 
  432. a sequencer which elects to use this as its only file format;  
  433. sequencers with their established feature-specific formats should 
  434. probably stick to the standard features when using this format.
  435.  
  436. 4   Program Fragments and Example MIDI Files
  437.  
  438. Here are some of the routines to read and write variable-length numbers 
  439. in MIDI Files.  These routines are in C, and use getc and putc, which 
  440. read and write single 8-bit characters from/to the files infile and 
  441. outfile.  
  442.  
  443. WriteVarLen (value)
  444. register long value;
  445. {
  446.     register long buffer;
  447.  
  448.     buffer = value & 0x7f;
  449.     while ((value >>= 7) > 0)
  450.     {
  451.         buffer <<= 8;
  452.         buffer |= 0x80;
  453.         buffer += (value & 0x7f);
  454.     }
  455.  
  456.     while (TRUE)
  457.     {
  458.         putc(buffer,outfile);
  459.         if (buffer & 0x80)
  460.             buffer >>= 8;
  461.         else
  462.             break;
  463.     } 
  464. }
  465.     
  466. doubleword ReadVarLen ()
  467. {
  468.      register doubleword value;
  469.     register byte c;
  470.     
  471.     if ((value = getc(infile)) & 0x80)
  472.     {
  473.         value &= 0x7f;
  474.         do
  475.         {
  476.             value = (value << 7) + ((c = getc(infile)) & 0x7f);
  477.         } while (c & 0x80);
  478.     }
  479.     return (value);
  480. }
  481.  
  482. As an example, MIDI Files for the following excerpt are shown below.  
  483. First, a format 0 file is shown, with all information intermingled; 
  484. then, a format 1 file is shown with all data separated into four tracks:  
  485. one for tempo and time signature, and three for the notes.  A resolution 
  486. of 96 "ticks" per quarter note is used.  A time signature of 4/4 and a 
  487. tempo of 120, though implied, are explicitly stated.
  488.  
  489. 
  490.  
  491.  
  492. The contents of the MIDI stream represented by this example are broken 
  493. down here:
  494.  
  495. Delta Time(decimal)  Event Code (hex)   Other Bytes (decimal)    
  496.     Comment
  497.     0    FF 58    04 04 02 24 08    4 bytes: 4/4 time, 24 MIDI 
  498. clocks/click, 
  499.                 8 32nd notes/24 MIDI clocks
  500.     0    FF 51    03 500000    3 bytes: 500,000 ╡sec per quarter-note
  501.     0    C0    5    Ch. 1, Program Change 5
  502.     0    C0    5    Ch. 1, Program Change 5
  503.     0    C1    46    Ch. 2, Program Change 46
  504.     0    C2    70    Ch. 3, Program Change 70
  505.     0    92    48  96    Ch. 3 Note On C2, forte
  506.     0    92    60  96    Ch. 3 Note On C3, forte
  507.     96    91    67  64    Ch. 2 Note On G3, mezzo-forte
  508.     96    90    76  32    Ch. 1 Note On E4, piano
  509.     192    82    48  64    Ch. 3 Note Off C2, standard
  510.     0    82    60  64    Ch. 3 Note Off C3, standard
  511.     0    81    67  64    Ch. 2 Note Off G3, standard
  512.     0    80    76  64    Ch. 1 Note Off E4, standard
  513.     0    FF 2F    00    Track End
  514.  
  515. The entire format 0 MIDI file contents in hex follow.  First, the header 
  516. chunk:
  517.  
  518.         4D 54 68 64     MThd
  519.         00 00 00 06    chunk length
  520.         00 00     format 0
  521.         00 01    one track
  522.         00 60     96 per quarter-note
  523.  
  524. Then, the track chunk.  Its header, followed by the events (notice that 
  525. running status is used in places):
  526.  
  527.         4D 54 72 6B    MTrk
  528.         00 00 00 3B    chunk length (59)
  529.  
  530.     Delta-time    Event    Comments
  531.     00    FF 58 04 04 02 18 08     time signature
  532.     00    FF 51 03 07 A1 20    tempo
  533.     00    C0 05
  534.     00    C1 2E
  535.     00    C2 46
  536.     00    92 30 60 
  537.     00    3C 60    running status
  538.     60    91 43 40
  539.     60    90 4C 20
  540.     81 40    82 30 40    two-byte delta-time
  541.     00    3C 40    running status
  542.     00    81 43 40
  543.     00    80 4C 40
  544.     00    FF 2F 00    end of track
  545.  
  546. A format 1 representation of the file is slightly different.  Its header 
  547. chunk:
  548.  
  549.         4D 54 68 64     MThd
  550.         00 00 00 06    chunk length
  551.         00 01     format 1
  552.         00 04    four tracks
  553.         00 60     96 per quarter-note
  554.  
  555. First, the track chunk for the time signature/tempo track.  Its header, 
  556. followed by the events:
  557.  
  558.         4D 54 72 6B    MTrk
  559.         00 00 00 14    chunk length (20)
  560.  
  561.     Delta-time    Event    Comments
  562.     00    FF 58 04 04 02 18 08     time signature
  563.     00    FF 51 03 07 A1 20    tempo
  564.     83 00    FF 2F 00    end of track
  565.  
  566. Then, the track chunk for the first music track.  The MIDI convention 
  567. for note on/off running status is used in this example:
  568.  
  569.         4D 54 72 6B    MTrk
  570.         00 00 00 10    chunk length (16)
  571.  
  572.     Delta-time    Event    Comments
  573.     00    C0 05
  574.     81 40    90 4C 20
  575.     81 40    4C 00    Running status: note on, vel = 0
  576.     00    FF 2F 00    end of track
  577.  
  578. Then, the track chunk for the second music track:
  579.  
  580.         4D 54 72 6B    MTrk
  581.         00 00 00 0F    chunk length (15)
  582.  
  583.     Delta-time    Event    Comments
  584.     00    C1 2E
  585.     60    91 43 40
  586.     82 20    43 00    running status
  587.     00    FF 2F 00    end of track
  588.  
  589. Then, the track chunk for the third music track:
  590.  
  591.         4D 54 72 6B    MTrk
  592.         00 00 00 15    chunk length (21)
  593.  
  594.     Delta-time    Event    Comments
  595.     00    C2 46
  596.     00    92 30 60 
  597.     00    3C 60    running status
  598.     83 00    30 00    two-byte delta-time, running status
  599.     00    3C 00    running status
  600.     00    FF 2F 00    end of track
  601.  
  602. 5   MIDI Transmission of MIDI Files
  603.  
  604. Since it is inconvenient to exchange disks between different computers, 
  605. and since many computers which will use this format will have a MIDI 
  606. interface anyway, MIDI seems like a perfect way to send these files from 
  607. one computer to another.  And, while we're going through all the trouble 
  608. to make a way of sending MIDI Files, it would be nice if they could send 
  609. any files (like sampled sound files, text files, etc.)
  610.  
  611. Goals
  612. The transmission protocol for MIDI files should be reasonably efficient, 
  613. should support fast transmission for computers which are capable of it, 
  614. and slower transmission for less powerful ones.  It should not be 
  615. impossible to convert a MIDI File to or from an arbitrary internal 
  616. representation on the fly as it is transmitted, but, as long as it is 
  617. not too difficult, it is very desirable to use a generic method so that 
  618. any file type could be accommodated.
  619.  
  620. To make the protocol efficient, the MIDI transmission of these files 
  621. will take groups of seven 8-bit bytes and transmit them as eight 7-bit 
  622. MIDI data bytes.  This is certainly in the spirit of the rest of this 
  623. format (keep it small, because it's not that hard to do).  To 
  624. accommodate a wide range of transmission speeds, files will be 
  625. transmitted in packets with acknowledge -- this allows data to be stored 
  626. to disk as it is received.  If the sender does not receive a response 
  627. from a reader in a certain amount of time, it can assume an open-loop 
  628. situation, and then just continue.  
  629.  
  630. The last edition of MIDI Files contained a specialized protocol for 
  631. sending just MIDI Files.  To meet a deadline, unfortunately I don't have 
  632. time right now to propose a new generalized protocol.  This will be done 
  633. within the next couple of months.  I would welcome any proposals anyone 
  634. else has, and would direct your attention to the proposal from Ralph 
  635. Muha of Kurzweil, available in a recent MMA bulletin, and also directly 
  636. from him.
  637.  
  638.